import hashlib
import json


def generate_request_sign(endpoint, method, params, app_flag, app_key):
    """
    生成请求签名
    :param endpoint: 端点路由，如：/api/v1/apps/extra_data
    :param method: 请求操作，如：GET
    :param params: 请求参数（字典）
    :param app_flag: 应用标识
    :param app_key: 应用私钥
    :return: 返回签名
    """
    # 1. 将请求参数按字典序排序并转为 JSON 字符串
    sorted_params = {k: params[k] for k in sorted(params.keys()) if params[k] is not None}
    params_string = json.dumps(sorted_params, separators=(',', ':'), ensure_ascii=False)

    # 2. 拼接字符串
    sign_string = f"{endpoint}|{method.upper()}|{params_string}|{app_flag}|{app_key}"

    # 3. 计算 MD5 签名
    sign = hashlib.md5(sign_string.encode('utf-8')).hexdigest()

    return sign


def generate_response_sign(response_data, app_flag, app_key):
    """
    生成响应签名
    :param response_data: 响应数据（字典）
    :param app_flag: 应用标识
    :param app_key: 应用私钥
    :return: 返回签名
    """
    # 1. 将响应数据按字典序排序并转为 JSON 字符串
    sorted_response = {k: response_data[k] for k in sorted(response_data.keys()) if response_data[k] is not None}
    response_string = json.dumps(sorted_response, separators=(',', ':'), ensure_ascii=False)

    # 2. 拼接字符串
    sign_string = f"{app_flag}|{app_key}|{response_string}"

    # 3. 计算 MD5 签名
    sign = hashlib.md5(sign_string.encode('utf-8')).hexdigest()

    return sign
